home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / PRGMANIA / VERSION1.5 / GEMSYST.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-12-27  |  13.7 KB  |  407 lines

  1. /*************************************************************************
  2.  *  GemForm.C : Fonctions de gestion des formulaires en fenetre.         *
  3.  *************************************************************************/
  4.  
  5. #include <unistd.h>
  6. #include <atari.h>
  7. #include "WindGem.h"
  8. #include "winproto.h"
  9.  
  10. /*-=< Inclusion des descriptions des objets UserDefs. >=-----------------*/
  11. #include "user.c"
  12.  
  13. /*-=< Section de declaration des fonctions privees >=--------------------*/
  14. static void coordonnees (void);
  15. static void GetSysInfo (void);
  16. static void MakeRsc (char *res, char *orig);
  17.  
  18. OBJECT *AdrDesk;                            /* Adresse du bureau                       */
  19. OBJECT *AdrMenu;                            /* Adresse du menu                         */
  20. int buff[8];                                    /* Buffer evenement                        */
  21. System *Sys;                                    /* Variable Systeme                        */
  22. DTA dtabuffer;                                /* Tampon DTA                              */
  23. Wind LstFen[NBWIND];                    /* Liste des fenetres (60 fenetres max.)   */
  24. int VdiHandle;                                /* Handle VDI                              */
  25. int AppId;                                        /* ID Application                          */
  26. char AppPath[128];                        /* Chemin de l'application                 */
  27. MachineInfo Ordi;                            /* Information système                     */
  28. int CurWindow;                                /* Numéro de l'objet WindGem courant       */
  29. char ErrMessageNoWind[128];        /* Message à afficher quand il n'y a plus  */
  30.                                                             /* de fenêtres disponibles.                */
  31.  
  32. /*************************************************************************
  33.  * Fonctions de gestion de l'application.                                *
  34.  *************************************************************************/
  35.  
  36. /*-----------------------------------------------------------------------*
  37.  * Fonction qui fixe les coordonnées des objets USerDefs.                *
  38.  *-----------------------------------------------------------------------*/
  39. static void coordonnees (void)
  40. {
  41.     register int i, j;
  42.  
  43.     for (i = 0 ; i < rs_nb_tree ; i++) /* Pour chaque arbre du RSC intégré,*/
  44.     {
  45.         j = 0;                                                     /* et chaque objet,                 */
  46.         do
  47.         {    /* Tant qu'on n'est pas au dernier objet */
  48.             rsrc_obfix (rs_trindex[i], j); /* Adapter coordonnées              */
  49.         } while (! (rs_trindex[i][j++].ob_flags & LASTOB));
  50.     }    
  51.     Sys->AdrUser = rs_trindex[0];
  52.     Sys->AdrIcone = rs_trindex[1];
  53.     Sys->AdrAide = rs_trindex[2];
  54.     Sys->AdrSlider = rs_trindex[3];
  55.     Sys->AdrAlerte = rs_trindex[4];
  56. }
  57.  
  58. /*-----------------------------------------------------------------------*
  59.  * Fonction d'initialisation de l'application.                           *
  60.  *                                                                       *
  61.  * fic_rsc    : Fichier .rsc de l'application                              *
  62.  * desk            : numero de l'objet pour bureau                              *
  63.  * gereDesk : fonction de gestion du bureau                              *
  64.  * menu            : numero de l'objet MENU                                     *
  65.  * gereMenu    : fonction de gestion du menu                                *
  66.  *-----------------------------------------------------------------------*/
  67. void AppInit(char *fic_rsc, int desk, void (*gereDesk)(int event), int menu, void (*gereMenu)(int event))
  68. {
  69.     int i, attributes[12];
  70.     char FicRsc[128];
  71.     
  72.     Sys = (System *)malloc(sizeof(System));
  73.  
  74.     Sys->AppId = appl_init();
  75.     AppId = Sys->AppId;
  76.  
  77.     for (i = 1 ; i < 9 ; _GemParBlk.intin[i++] = 1);
  78.     _GemParBlk.intin[0] = Getrez() + 2;             /* on récupère la résolution  */
  79.     _GemParBlk.intin[9] = 0;                                 /* Couleur de Remplissage = 0 */
  80.     _GemParBlk.intin[10]= 2;                                 /* des coordonnées            */
  81.  
  82.     Sys->VdiHandle = graf_handle(&(Sys->Wchar), &(Sys->Hchar), &(Sys->Wcell), &(Sys->Hcell));
  83.     
  84.     Sys->Hchar++;                     /* +1 pour eviter que les lignes ne se touchent */
  85.     /* Ouverture station de travail virtuelle */
  86.     v_opnvwk (_GemParBlk.intin, &(Sys->VdiHandle), _GemParBlk.intout);
  87.     VdiHandle = Sys->VdiHandle;
  88.  
  89.     GetSysInfo();                                    /* Récupération des informations système */
  90.  
  91.     if (_GemParBlk.intout[13] < 16)
  92.     { /* Etablissement des couleurs 3D */
  93.         Sys->color_3d1 = WHITE;                                                          /* color index 0 */
  94.         Sys->color_3d2 = BLACK;                                /* color index 1 */
  95.     }
  96.     else
  97.     {
  98.         Sys->color_3d1 = LWHITE;                              /* color index 8 */
  99.         Sys->color_3d2 = LBLACK;                              /* color index 9 */
  100.     }
  101.     
  102.     /* Coordonnées du bureau */
  103.     wind_get (0, WF_WORKXYWH, &(Sys->Xdesk), &(Sys->Ydesk), &(Sys->Wdesk), &(Sys->Hdesk));
  104.  
  105.     Sys->Xres = _GemParBlk.intout[0];            /* Resolution en X du bureau     */
  106.     Sys->Yres = _GemParBlk.intout[1];            /* Resolution en Y du bureau     */
  107.  
  108.     vq_extnd (Sys->VdiHandle, TRUE, _GemParBlk.intout);
  109.     Sys->Nplane = _GemParBlk.intout[4];        /* Nombre de plans de couleurs   */
  110.     Sys->lastImg = 1000;                                    /* Der. num. pour fenetre image  */
  111.     Sys->lastTxt = 4000;                                    /* Der. num. pour fenetre texte  */
  112.     Sys->lastUsr = 7000;                                    /* Der. num. pour fenetre user   */
  113.  
  114.     vqt_attributes(Sys->VdiHandle, attributes);
  115.     /* Ligne de base des caractères + 1 pour éviter que la première ligne 
  116.     de texte ne touche le haut de la fenêtre. */
  117.     Sys->baseline = 1 + attributes[7];         
  118.  
  119.     MakeRsc (FicRsc, fic_rsc);
  120.  
  121.     if (NOT rsrc_load(FicRsc))
  122.     {
  123.         char mes[60];
  124.  
  125.         sprintf(mes,"[2][| Le Fichier Ressource |    %s    | n'a pu être trouvé.][ Quitter ]",FicRsc);
  126.         form_alert(1,mes);
  127.       wind_set (0, WF_NEWDESK, 0, 0);                     /* Rendre le bureau        */
  128.         v_clsvwk(Sys->VdiHandle);                                    /* Efface l'ecran          */
  129.       form_dial (FMD_FINISH, 0, 0, 0, 0, Sys->Xdesk, Sys->Ydesk, Sys->Wdesk, Sys->Hdesk); 
  130.         free (Sys);
  131.         appl_exit();                                                            /* Fermer application      */
  132.         exit(1);    
  133.     }
  134.     else
  135.     {
  136.         /* Init. des 60 fenetres */
  137.         for (i=0; i<NBWIND; i++)
  138.         {
  139.             LstFen[i].handle    = BLANK;
  140.             LstFen[i].numObj    = BLANK;
  141.             LstFen[i].type        = WTYPNONE;
  142.             LstFen[i].mode        = WNORM;
  143.             LstFen[i].attrib  = ZERO;
  144.             LstFen[i].w_title    = (char *)NULL;
  145.             LstFen[i].iconified = FALSE;
  146.             LstFen[i].adr_wmenu = (OBJECT *)NULL;
  147.             LstFen[i].wmenu     = (void *)NULL;
  148.             LstFen[i].adr_wtoolbar = (OBJECT *)NULL;
  149.             LstFen[i].wtoolbar     = (void *)NULL;
  150.         }
  151.  
  152.         /* Mise en place du Bureau *******************************************/
  153.         LstFen[0].type        = WTYPDESK;
  154.         LstFen[0].handle    = 0;
  155.         
  156.         /* Si bureau , le creer en tant que fenetre 0 */
  157.         if (desk != BLANK)
  158.         {
  159.             rsrc_gaddr (0, desk, &AdrDesk);            /* Demander adresse bureau */
  160.           AdrDesk->ob_x = Sys->Xdesk;                 /* Mettre le bureau aux    */
  161.           AdrDesk->ob_y = Sys->Ydesk;                   /* bonnes dimensions.      */
  162.           AdrDesk->ob_width = Sys->Wdesk;
  163.           AdrDesk->ob_height = Sys->Hdesk;
  164.           wind_set (0, WF_NEWDESK, AdrDesk, 0);/* Fixer le nouveau bureau */
  165.                                                                                             /* et l'afficher.          */
  166.           form_dial (FMD_FINISH, 0, 0, 0, 0, Sys->Xdesk, Sys->Ydesk, Sys->Wdesk, Sys->Hdesk); 
  167.             LstFen[0].numObj    = desk;
  168.             Sys->gereDesk    = gereDesk;
  169.         }
  170.         else
  171.             AdrDesk  = (OBJECT *)NULL;
  172.  
  173.         /* Mise en place du Menu *********************************************/
  174.         if (menu != BLANK)
  175.         {
  176.             rsrc_gaddr (0, menu, &AdrMenu);                    /* Demander adresse menu   */
  177.           menu_bar (AdrMenu, 1);                              /* Afficher le menu        */
  178.             Sys->menu = gereMenu;
  179.         }
  180.         else
  181.             AdrMenu  = (OBJECT *)NULL;
  182.  
  183.         Sys->AdrObjet = (OBJECT *)NULL;                /* Objet pour gestion interne  */
  184.         Sys->objet    = ZERO;                                        /* idem */
  185.         Sys->pos        = ZERO;                                        /* idem */
  186.  
  187.         /* Popup lors de l'appui sur bouton droit */
  188.         Sys->popMenu = BLANK;
  189.         Sys->popup = (void *)NULL;
  190.     }
  191.     getcwd(AppPath, 128);                                /* Récupération du chemin du prog. */
  192.  
  193.     Fsetdta (&dtabuffer);                                             /* Fixer adresse tampon DTA */
  194.  
  195.     coordonnees();                                     /* Mise en place des boutons userdefs */
  196.  
  197.     CurWindow = 0;
  198.     graf_mouse(ARROW, 0);
  199.  
  200. }
  201.  
  202. static void MakeRsc (char *res, char *orig)
  203. {
  204.     char extension[4];
  205.     char pays[6];
  206.     
  207.     strcpy (pays, " .rsc");
  208.     strcpy (res, orig);
  209.  
  210.     strright (extension, orig, 4);
  211.     if (strcmp(extension, ".rsc") != 0)
  212.     {
  213.         switch (Ordi.Language)
  214.         {
  215.             case LG_F :
  216.             case LG_CHF :
  217.                 pays[0] = 'F';
  218.                 strcpy (ErrMessageNoWind, "[3][Plus de fenêtres disponibles !|Fermez en une non utilisée.][Confirmer]");
  219.                 break;
  220.             case LG_USA :
  221.             case LG_GB :
  222.                 pays[0] = 'E';
  223.                 strcpy (ErrMessageNoWind, "[3][No more windows left !|You must close at least one.][Confirm]");
  224.                 break;
  225.             case LG_I :
  226.                 pays[0] = 'I';
  227.                 strcpy (ErrMessageNoWind, "[3][No more windows left !|You must close at least one.][Confirm]");
  228.                 break;
  229.             case LG_SP :
  230.                 pays[0] = 'S';
  231.                 strcpy (ErrMessageNoWind, "[3][No more windows left !|You must close at least one.][Confirmer]");
  232.                 break;
  233.             case LG_D :
  234.             case LG_CHD :
  235.                 pays[0] = 'D';
  236.                 strcpy (ErrMessageNoWind, "[3][Kein Fenster mehr !|Du mu₧t eine Fenster Schlie₧en.][Verstanden]");
  237.                 break;
  238.             default :
  239.                 pays[0] = 'E';
  240.                 strcpy (ErrMessageNoWind, "[3][No more windows left !|You must close at least one.][Confirm]");
  241.         }
  242.  
  243.         strcat (res, pays);
  244.     }
  245. }
  246.  
  247. /*-----------------------------------------------------------------------*
  248.  * Fermeture de l'application                                            *
  249.  *-----------------------------------------------------------------------*/
  250. void AppExit(void)
  251. {
  252.     register int i;
  253.  
  254.     /* Destruction de toutes les fenetres */
  255.     for (i=1; i<NBWIND; i++)
  256.         if (LstFen[i].type != WTYPNONE)
  257.             WindDelete(LstFen[i].numObj);
  258.  
  259.     if (AdrMenu != (OBJECT *)NULL)
  260.       menu_bar (AdrMenu, 0);                                    /* Virer la barre de menu  */
  261.  
  262.     if (AdrDesk != (OBJECT *)NULL)
  263.       wind_set (0, WF_NEWDESK, 0, 0);                        /* Rendre le bureau        */
  264.  
  265.     rsrc_free();                                                                /* Liberer espace RSC      */
  266.     v_clsvwk(Sys->VdiHandle);                                        /* Efface l'ecran          */
  267.  
  268.     /* Restauration de l'écran */
  269.   form_dial (FMD_FINISH, 0, 0, 0, 0, Sys->Xdesk, Sys->Ydesk, Sys->Wdesk, Sys->Hdesk); 
  270.     free (Sys);
  271.     appl_exit();                                                                /* Fermer application      */
  272. }
  273.  
  274. static void GetSysInfo (void)
  275. {
  276.     long cookie;
  277.     
  278.   /*
  279.    *    Par défaut Atari ST Français
  280.    */  
  281.   Ordi.Processor    = M68000;
  282.   Ordi.Machine        = ST;
  283.   Ordi.Switch            = FALSE;
  284.   Ordi.Fdc                = FALSE;
  285.   Ordi.Keyboard        = KEYB_F;
  286.   Ordi.Language        = LG_F;
  287.   Ordi.Shifter        = SHIFTER_ST;
  288.   Ordi.Sound            = PSG;
  289.   Ordi.Fpu                = NO_FPU;
  290.   Ordi.Separator    = '/';
  291.   Ordi.Time             = TIME_12;
  292.   Ordi.Date                = DATE_MJA;
  293.   /*
  294.    *    Try to get the true value from the Cookie Jar System
  295.    */
  296.   if(Getcookie('_CPU',&cookie))        /* Copy all cookies */
  297.     Ordi.Processor    = (int)(cookie & 0xFFFF);
  298.   if(Getcookie('_MCH',&cookie))
  299.     Ordi.Machine        = cookie;
  300.   if(Getcookie('_SWI',&cookie))
  301.     Ordi.Switch        = (int)(cookie & 0x00FF);
  302.   if(Getcookie('_FDC',&cookie))
  303.     Ordi.Fdc                = cookie;
  304.   if(Getcookie('_AKP',&cookie))
  305.   {
  306.     Ordi.Keyboard = (int)(cookie & 0x00FF);
  307.     Ordi.Language = (int)((cookie & 0xFF00) >> 8);
  308.   }
  309.   if(Getcookie('_VDO',&cookie))
  310.     Ordi.Shifter    = cookie;
  311.   if(Getcookie('_SND',&cookie))
  312.     Ordi.Sound        = loword(cookie);
  313.   if(Getcookie('_FPU',&cookie))
  314.     Ordi.Fpu         = hiword(cookie);
  315.   if(Getcookie('_IDT',&cookie))
  316.   {
  317.     Ordi.Separator    = (int) (cookie & 0x00FF);
  318.     Ordi.Date             = (int)((cookie & 0x0F00) >> 8);
  319.     Ordi.Time             = (int)((cookie & 0xF000) >> 12);
  320.   }
  321.  
  322.   Ordi.TosVersion        = _tos;
  323.   Ordi.GemdosVersion = Sversion();
  324.   Ordi.AesVersion        = gl_apversion; 
  325.   if(Getcookie('MiNT',&cookie))                                /* Mot faible = version */
  326.     Ordi.MultiTosVersion = loword(cookie);
  327.   else                                                                                /* MultiTos no found */
  328.     Ordi.MultiTosVersion = FALSE;
  329.     if (Getcookie('MagX', &cookie))
  330.     {
  331.         if (cookie)
  332.             Ordi.Magic = TRUE;
  333.         else
  334.             Ordi.Magic = FALSE;
  335.     }
  336. }
  337.  
  338. /*************************************************************************
  339.  * Ajoute un nouvel objet Wind dans la liste des fenetres.               *
  340.  *                                                                       *
  341.  * Validation            : 24/04/1996                                    *
  342.  *************************************************************************/
  343. void AjouteListe(int type, int attrib, int numObj, int mode, char *title, GRECT pos, void *ptr_var)
  344. {
  345.     int ind = 1;
  346.  
  347.     while (ind < NBWIND && LstFen[ind].type != WTYPNONE) ind++;
  348.     
  349.     LstFen[ind].type        = type;
  350.     LstFen[ind].numObj    = numObj;
  351.     LstFen[ind].mode        = mode;
  352.     LstFen[ind].attrib    = attrib;
  353.     LstFen[ind].Xpos        = pos.g_x;
  354.     LstFen[ind].Ypos        = pos.g_y;
  355.     LstFen[ind].Wpos        = pos.g_w;
  356.     LstFen[ind].Hpos        = pos.g_h;
  357.     LstFen[ind].w_title    = (char *)malloc(strlen(title)+1);
  358.     strcpy(LstFen[ind].w_title, title);
  359.     LstFen[ind].adr_wmenu    = (OBJECT *)NULL;
  360.     LstFen[ind].wmenu        = (void *)NULL;
  361.     LstFen[ind].adr_wtoolbar = (OBJECT *)NULL;
  362.     LstFen[ind].wtoolbar    = (void *)NULL;
  363.  
  364.     if (type == WTYPFORM)
  365.         LstFen[ind].cont.dialog    = (WindForm *)ptr_var;
  366.     else if (type == WTYPTEXT)
  367.         LstFen[ind].cont.text        = (WindText *)ptr_var;
  368.     else
  369.         LstFen[ind].cont.user        = (WindUser *)ptr_var;
  370.  
  371. }
  372.  
  373. /*-----------------------------------------------------------------------*
  374.  * Retourne l'objet Wind associe a l'objet <numObj>, NULL sinon          *
  375.  *-----------------------------------------------------------------------*/
  376. Wind *ObjListe(int numObj)
  377. {
  378.     register int i = 1;
  379.  
  380.     while (i < NBWIND)
  381.     {
  382.         if (LstFen[i].numObj == numObj)
  383.             return &LstFen[i];
  384.         i++;
  385.     }
  386.     return WIND_NULL;
  387. }
  388.  
  389. /*-----------------------------------------------------------------------*
  390.  * Retourne l'objet de handle <handle> donne, NULL sinon                 *
  391.  *-----------------------------------------------------------------------*/
  392. Wind *TopListe(int handle)
  393. {
  394.     register int i = 1;
  395.  
  396.     while (i < NBWIND)
  397.     {
  398.         if (LstFen[i].handle == handle)
  399.             return &LstFen[i];
  400.         i++;
  401.     }
  402.     return WIND_NULL;
  403. }
  404.  
  405.  
  406. /**************************-=< Fin du module >=-**************************/
  407.